<?php

    /**
     * LeafPHP核心类库，提供核心的业务处理，开启APC可减少内存占用
     */

    class Core {

        /**
         * 初始化操作，切勿调整主干加载顺序，否则可能造成框架崩溃
         * @access public
         */
        static public function init(){
            self::initConst();            //常量初始化
            self::addPreLoads();          //加载计量初始化，即$leaf['loadedFiles']
            self::getConfig();            //获取系统级配置
            self::setTimeZone();          //设置时区
            self::leafSet();              //根据PHP设置，进行LeafPHP设置
            self::loadLang();             //加载语言配置，以实现配置的存取
            self::setAutoLoad();          //设置自动加载
            self::initErrorHandler();     //初始化错误处理器
            Monitor::G('begin');          //标记开始的内存和时间计量
            self::setHeader();            //设置头信息
            //检测PHP版本
            version_compare(phpversion(), '5.2.0', '<') && error(L('php_version_error'));
            self::initApp();            //检测，并初始化应用
            Monitor::G('end');            //标记结束的内存和时间计量
            self::theLastRun();            //最后运行的方法
        }

        /**
         * 设置时区
         */
        static private function setTimeZone(){
                date_default_timezone_set(C('timezone'));
        }

        /**
         * 魔术引用的处理和处理gpc的特殊字符
         */
        static private function leafSet(){
            //设置对魔术引用的处理和处理gpc的特殊字符
            if (!get_magic_quotes_gpc()) {
                $gpc = array($_POST,$_GET,$_COOKIE,$_REQUEST);
                foreach ($gpc as &$value) {
                    !empty($value) /*&& ($value = array_map('gpc_str_replace', $value))*/ && ($value = array_map('addslashes', $value));
                }
            }
        }

        /**
         * 增加加载文件计量
         * @access public
         */
        static public function addPreLoads(){
            $preLoadFiles = array(__CORE__.__SP__.'class.Function.php',  __CORE__.__SP__.'class.Core.php');
            addLoadedFile($preLoadFiles); 
        }

        /**
         * 初始化一些路径常量
         * @access private
         */
        static private function initConst(){
            define('__IS_LEAF__', true);
            !defined('__DIR__') && define('__DIR__',dirname(__FILE__));        //设置__DIR__
            define('__SP__',DIRECTORY_SEPARATOR);
            define('__APPROOT__', dirname($_SERVER['SCRIPT_FILENAME']));
            define('__LEAF__', __APPROOT__.__SP__.'leafphp');
            define('__CORE__', __LEAF__.__SP__.'core');
            define('__DRIVER__', __LEAF__.__SP__.'driver');
            define('__LEAF_LANG__', __LEAF__.__SP__.'lang');
            define('__LEAF_CONF_', __LEAF__.__SP__.'config');
            define('__LEAF_COMMON__', __LEAF__.__SP__.'common');
        }

        /**
         * 加载日志处理、错误处理类、监测类等拓展类
         */
        static private function loadExClass(){
            $extendArr = array();
            $extendArr[] = $logClassFile = __CORE__.__SP__.'class.Log.php';
            $extendArr[] = $errorClassFile = __CORE__.__SP__.'class.Error.php';
            //$extendArr[] = $errorMonitorFile = __CORE__.__SP__.'class.Monitor.php';
            foreach ($extendArr as $key => $value) {
                load($value);
            }
        }

        /**
         * 设置错误处理器，主要用于调用错误处理接口
         */
        static private function initErrorHandler(){
            Error::init();
        }

        /**
         * 获取系统语言配置，并放入全局数组
         * 注意，该文件必须为utf-8格式，书写格式参考php.ini即可
         */
        static private function loadLang(){
            global $leaf;
            $lang_file = __LEAF_LANG__.__SP__.'lang.Cn.ini';
            file_exists_case($lang_file) ? $leafLang=@parse_ini_file($lang_file) : exit('框架中的语言配置文件丢失！');
            if(!$leafLang){
                exit('系统语言配置有错误，请检查！位置：'.$lang_file);
            }
            C('lang', $leafLang, true);
            //加载计数器+1
            addLoadedFile($lang_file);
        }

        /**
         * 设置utf8 header头信息
         * @access private
         */
        static private function setHeader(){
            if(!headers_sent()){
                send_http_header();
            }
        }

        /**
         * 设置自动加载
         * @access private
         */
        static private function setAutoLoad(){
            //定义多个自动加载器，当加载类失败时，可继续尝试加载
            spl_autoload_register('self::leafAutoLoad');
            spl_autoload_register('self::appAutoLoad');
        }

        /**
         * Leaf自动加载
         * @param string $class 类名称
         * @return void
         */
        static private function leafAutoLoad($class){
            $folders = array(
                __CORE__.__SP__.'class.'.$class.'.php',
                __DRIVER__.__SP__.'db'.__SP__.'class.'.$class.'.php',
                __DRIVER__.__SP__.'cache'.__SP__.'class.'.$class.'.php',
            );
            foreach ($folders as $key => $value) {
                $className = $value;
                $loadReturn = load($className, 'require');
                if ($loadReturn) {
                    break;
                }
            }
        }

        /**
         * App自动加载，如果是自动加载控制器、服务层等，则app常量已设定
         * @access private
         * @return void
         */
        static private  function appAutoLoad($class){
            $folders = array(
                __CONTROLLER_PATH__.__SP__.$class.'.php',
                __SERVICE_PATH__.__SP__.$class.'.php',
            );
            $loadReturn = false;
            foreach ($folders as $key => $value) {
                $className = $value;
                $loadReturn = load($className, 'require');
                if ($loadReturn) {
                    break;
                }
            }
            if(!$loadReturn) error($class.L('not_exists'));
        }

        /**
         * 获取系统的配置文件信息，合并到全局变量$leaf中
         * @access private
         */
        static private function getConfig(){
            $configFile = __LEAF_CONF_.__SP__.'config.php';
            $config=array();
            file_exists_case($configFile) ? $config=require $configFile : error(L('confile_not_exists'));
            C('config', $config ,true);
            addLoadedFile($configFile);
        }

        /**
         * 检测应用设置
         * @access private
         */
        static private function initApp(){
            //应用初始化
            App::init();
        }

        /**
         * 主框架最后调用的方法
         * @access private
         */
        static private function theLastRun(){
            self::makeCache();        //生成框架系统缓存
            self::getRunTM();        //获取运行的时间和内存占用
        }

        /**
         * 获取运行的时间和内存占用
         */
        static private function getRunTM(){
            global $leaf;
            $leaf['run_time'] = Monitor::G('begin', 'end', 6);
            $leaf['mem_usage'] = Monitor::G('begin','end','m');
        }

        /**
         * 生成框架系统缓存，将读取语言，配置，加载文件，
         */
        static private function makeCache(){

        }
    }
?>